package top.jacktgq.lock.reentrantLock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

import top.jacktgq.utils.LogUtils;
import top.jacktgq.utils.Sleeper;
/**
 * 
 * @Title: TestReentrantLock.java 
 * @Package top.jacktgq.lock 
 * @Description: 测试ReentrantLock：锁超时，尝试获得锁，并且返回一个布尔值
 * @author CandyWall   
 * @date 2020年11月1日 下午5:49:07 
 * @version V1.0
 */
public class Demo3 {
	private static ReentrantLock lock = new ReentrantLock();
	public static void main(String[] args) {
		Thread t1 = new Thread(() -> {
			LogUtils.log("Demo3", "尝试获得锁");
			//由于主线程获得了锁也没有释放， 会使得t1线程尝试获取锁失败，但是这个方法获取失败后不会阻塞，程序会继续向下执行
			//所以为了保证线程的同步，需要在没有获取到锁的时候自己做逻辑判断
			//如果方法中传timeout参数，可以在指定时间内尝试获得锁，如果获取不到然后再返回false
			try {
				if(!lock.tryLock(2, TimeUnit.SECONDS)) {
					LogUtils.log("Demo3", "获取不到锁");
					return;
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
				LogUtils.log("Demo3", "获取不到锁");
				return;
			}
			try {
				//同步代码块部分
				LogUtils.log("Demo3", "获取到锁");
			} finally {
				lock.unlock();
			}
		}, "t1");
		
		//主线程在t1线程启动前先获得了锁
		LogUtils.log("Demo3", "主线程获得锁");
		lock.lock();
		
		t1.start();
		Sleeper.sleep(1);
		/*LogUtils.log("Demo3", "打断t1");
		t1.interrupt();*/
		LogUtils.log("Demo3", "主线程释放锁");
		lock.unlock();
	}
	
}
